package com.quick.develop.flowable.service.task;

import com.quick.develop.flowable.enums.BpmExecuteCmd;
import com.quick.develop.framework.utils.collection.CollectionUtils;
import org.flowable.engine.task.Comment;
import org.flowable.engine.task.Event;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author junyuan.liu
 * @description: 
 * @date 2022/7/1 14:27
 */
public interface IBpmCommentService {
    /** 
     * @description  调用taskService.api查询  默认查询 type='comment'
     * @param id 
     * @return java.util.List<org.flowable.engine.task.Comment>
     * @author junyuan.liu
     * @date 2022/7/1 14:31
     */ 
    List<Comment> getTaskCommentByTaskId(String id);

    /** 
     * @description  根据任务ID 获取审批意见集合 
     * @param ids 任务Ids
     * @return java.util.Map<java.lang.String,java.util.List<org.flowable.engine.task.Comment>>
     * @author junyuan.liu
     * @date 2022/7/4 14:50
     */ 
    Map<String, List<Comment>> getTaskCommentsByTaskIds(Set<String> ids);

    /**
     * @description 获取流程实例期间审批记录
     * @param processInstanceId 流程实例ID
     * @return java.util.List<org.flowable.engine.task.Comment>
     * @author junyuan.liu
     * @date 2022/5/4 13:44
     */
    List<Comment> getTaskCommentByProcessId(String processInstanceId);
    
    /** 
     * @description 获取流程实例期间审批记录
     * @param processInstanceIds 流程实例IDs
     * @return java.util.List<org.flowable.engine.task.Comment>
     * @author junyuan.liu
     * @date 2022/8/12 11:18
     */ 
    List<Comment> getTaskCommentByProcessIds(Collection<String> processInstanceIds);

    /**
     * @description  获取审批意见 按taskId分组
     * @param processInstanceId 流程实例ID
     * @return java.util.Map<java.lang.String,java.util.List<org.flowable.engine.task.Comment>>
     * @author junyuan.liu
     * @date 2022/5/4 13:51
     */
    default Map<String, List<Comment>> getTaskCommentMapByProcessInstanceId(String processInstanceId){
        return CollectionUtils.convertMultiMap(
                getTaskCommentByProcessId(processInstanceId),
                Comment::getTaskId);
    }
    
    /** 
     * @description 获取审批意见 按taskId分组
     * @param processInstanceIds 流程实例ID集合
     * @return java.util.Map<java.lang.String,java.util.List<org.flowable.engine.task.Comment>>
     * @author junyuan.liu
     * @date 2022/8/12 11:28
     */ 
    default Map<String, List<Comment>> getTaskCommentMapByProcessInstanceIds(Collection<String> processInstanceIds){
        return CollectionUtils.convertMultiMap(
                getTaskCommentByProcessIds(processInstanceIds),
                Comment::getTaskId);
    }

    /** 
     * @description  获取任务所有的comment
     * @param taskId 任务ID
     * @return java.util.List<org.flowable.engine.task.Event>
     * @author junyuan.liu
     * @date 2022/7/1 15:08
     */ 
    List<Event> getTaskEvents(String taskId);

    /**
     * @description  新增意见
     * @param taskId 任务ID
     * @param processInstanceId 流程实例ID
     * @param message 意见内容
     * @param cmd 处理类型
     * @param txt 转办、委托的处理人 或一些其他信息
     * @author junyuan.liu
     * @date 2022/6/22 13:55
     */
    void addComment(String taskId, String processInstanceId, String message, BpmExecuteCmd cmd, String txt);


}
